package com.jtfr.core;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 遍历所有Mapper下面的xml文件
 * 还没有做容错处理
 * @author ckm
 *
 */
public class MapperHandler {
	 
    private static MapperHandler instance = new MapperHandler();
    
    private MapperHandler() {}
    /**
     * 获取 MapperHandler 对象
     * @return
     */
    public static MapperHandler getSqlMapperHolder() {
    	return instance;
    }
    
 
    private static Map<String, MapperMethodInfo> map = new HashMap<String, MapperMethodInfo>();
 
    static{
        // 获取 mapper.xml 文件所在路径
        File dir = new File(MapperHandler.class.getClassLoader().getResource(Config.getConfig().getMapperPath()).getFile());
 
        // 用 dom4j 解析
        SAXReader reader = new SAXReader();
        try {
            for (String file : dir.list()) {
            	// 读取mapper.xml
                Document doc = reader.read(new File(dir, file));
                Element root = doc.getRootElement();
                // 获取接口全路径名
                String className = root.attributeValue("namespace");
 
                for (Object o : root.elements()) {
                    Element e = (Element) o;
                    // 创建个 MapperMethodInfo 对象用于存放 
                    MapperMethodInfo info = new MapperMethodInfo();
                    info.setQueryType(QueryType.value(e.getName()));
                    info.setInterfaceName(className);
                    info.setMethodName(e.attributeValue("id"));
                    info.setResultType(e.attributeValue("resultType"));
                    info.setSql(e.getText());
 
                    map.put(idOf(className, e.attributeValue("id")), info);
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 通过接口 全路径名 和 方法名 获取对应的 MapperMethodInfo
     * @param className
     * @param methodName
     * @return
     */
    public static MapperMethodInfo getMapperInfo(String className, String methodName) {
        return map.get(idOf(className, methodName));
    }
 
    /**
     * 接口全路径+"."+方法名作为 Map 唯一的 key
     */
    private static String idOf(String className, String methodName) {
        return className + "." + methodName;
    }
}
